package jieyasuoliu;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class demo4 {
    public static void main(String[] args) throws IOException {
        //1.创建一个解压缩流的文件
        File src = new File("D:\\副本.zip");
        //2.创建一个解压缩流的目的地文件
        File dest = new File("D:\\copy2");
        //3.调用方法开始解压缩
        unZip(src, dest);
    }
    private static void unZip(File src, File dest) throws IOException {
        //解压的本质：把压缩包里面的每一个文件或者文件夹读取出来，按照层级拷贝到目的地当中
        //创建一个解压缩流用来读取压缩包中的数据
        ZipInputStream zip = new ZipInputStream(new FileInputStream(src));
        //要先获取到压缩包里面的每一个entry对象
        //表示当前在压缩包中获取到的文件或者文件夹
        ZipEntry entry;
        //这个entry就是压缩包里面的每一个文件或者文件夹
        //也就是说entry可以获取压缩包里的所有文件或者文件夹，不需要递归了
        while ((entry = zip.getNextEntry()) != null) {
            System.out.println(entry);
            if (entry.isDirectory()) {
                //如果是文件夹：就在dest目的地创建一个同名字的文件夹
                File dir = new File(dest, entry.getName());
                dir.mkdirs();

            } else {
                //如果是文件，就在dest目的地创建一个同名的文件，并且把数据读取到文件当中
                /*细节：
                比如这个entry就是22.txt  ggg/   kk/  kk/2342.txt
                在创建文件的时候entry.getName()得到的是22.txt  kk/2342.txt
                所以这个entry会根据路径创建文件
                 */
                File file = new File(dest, entry.getName());
                FileOutputStream pos = new FileOutputStream(file);
                //读取压缩包里的文件
                int b;
                while ((b = zip.read()) != -1) {
                    //把读取的数据写入到目的地当中
                    pos.write(b);
                }
                pos.close();
                zip.closeEntry();
            }
        }
    }
}
